#pragma once

using namespace System;

namespace $RootNamespace$
{

	/// <summary>
	/// The '$Implementor$' abstract class
	/// </summary>
	private ref class $Implementor$ abstract
	{
	public:
		virtual void OperationImp() abstract;
	};

	/// <summary>
	/// The '$Abstraction$' class
	/// </summary>
	private ref class $Abstraction$
	{
		// Property
	public:
		property $Implementor$ ^$Implementor$;

		virtual void Operation();
		/// <summary>
		/// Just for testing.
		/// </summary>
		static void Test();
	};



	/// <summary>
	/// The '$RefinedAbstraction$' class
	/// </summary>
	private ref class $RefinedAbstraction$ : $Abstraction$
	{
	public:
		virtual void Operation() override;
	};



	/// <summary>
	/// The 'ConcreteImplementorA' class
	/// </summary>
	private ref class CLIConcreteImplementorA : $Implementor$
	{
	public:
		virtual void OperationImp() override;

	};



	/// <summary>
	/// The 'ConcreteImplementorB' class
	/// </summary>
	private ref class CLIConcreteImplementorB : $Implementor$
	{
	public:
		virtual void OperationImp() override;

	};


}

